package com.gbb.common.widget;

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.ScrollView;

/**
 * ScrollView实现阻尼回弹效果
 *
 * @author unknown
 */
public class FlipScrollView extends ScrollView {

    // 拖动的距离 SIZE = 4 的意思 只允许拖动屏幕的1/4
    private static final int SIZE = 4;

    private View inner;

    private float y;

    private Rect normal = new Rect();

    public FlipScrollView(Context context){
        super(context);
    }

    public FlipScrollView(Context context,AttributeSet attrs){
        super(context,attrs);
    }

    @Override
    protected void onFinishInflate(){
        super.onFinishInflate();
        if(getChildCount() > 0) {
            inner = getChildAt(0);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev){
        if(inner == null) {
            return super.onTouchEvent(ev);
        } else {
            commOnTouchEvent(ev);
        }
        return super.onTouchEvent(ev);
    }

    public void commOnTouchEvent(MotionEvent ev){
        int action = ev.getAction();
        switch(action) {
            case MotionEvent.ACTION_DOWN:
                y = ev.getY();
                break;
            case MotionEvent.ACTION_UP:
                if(isNeedAnimation()) {
                    // Log.v("mlguitar", "will up and animation");
                    startAnimation();
                }
                break;
            case MotionEvent.ACTION_MOVE:
                final float preY = y;
                float nowY = ev.getY();

                int deltaY = (int) (preY - nowY)/SIZE;
                // 滚动
                // scrollBy(0, deltaY);

                y = nowY;
                // 当滚动到最上或者最下时就不会再滚动，这时移动布局
                if(isNeedMove()) {
                    if(normal.isEmpty()) {
                        // 保存正常的布局位置
                        normal.set(inner.getLeft(),inner.getTop(),inner.getRight(),inner.getBottom());
                        return;
                    }
                    int yy = inner.getTop() - deltaY;

                    // 移动布局
                    inner.layout(inner.getLeft(),yy,inner.getRight(),inner.getBottom() - deltaY);
                }
                break;
            default:
                break;
        }
    }

    // 开启动画移动

    public void startAnimation(){
        // 开启移动动画
        TranslateAnimation ta = new TranslateAnimation(0,0,inner.getTop(),normal.top);
        ta.setDuration(200);
        inner.startAnimation(ta);
        // 设置回到正常的布局位置
        inner.layout(normal.left,normal.top,normal.right,normal.bottom);
        normal.setEmpty();
    }

    // 是否需要开启动画
    public boolean isNeedAnimation(){
        return !normal.isEmpty();
    }

    // 是否需要移动布局
    public boolean isNeedMove(){
        int offset = inner.getMeasuredHeight() - getHeight();
        int scrollY = getScrollY();
        return scrollY == 0 || scrollY == offset;
    }

}
